xm,xend: Add commands to hotplug usb devices to hvm guests
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 19 Oct 2009 09:48:47 +0000 (10:48 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 19 Oct 2009 09:48:47 +0000 (10:48 +0100)
Signed-off-by: James Song Wei <jsong@novell.com>
tools/python/xen/xend/XendDomain.py
tools/python/xen/xend/server/SrvDomain.py
tools/python/xen/xm/main.py

index 9c8516de270dc80cab5d04ba24e4c61037d5075e..55e8380f6a23ee26f3eeb852d1d2984dfe7773a5 100644 (file)
@@ -1522,6 +1522,45 @@ class XendDomain:
             raise XendError("can't write guest state file %s: %s" %
                             (dst, ex[1]))
 
+    def domain_usb_add(self, domid, dev_id):
+        dominfo = self.domain_lookup_nr(domid)
+        if not dominfo:
+            raise XendInvalidDomain(str(domid))
+
+        usb = dominfo.info['platform'].get('usb')
+        if not usb:
+            raise XendError("Can't add usb device to a guest with usb disabled in configure file")
+
+        hvm = dominfo.info.is_hvm()
+        if not hvm:
+            raise XendError("Can't add usb device to a non-hvm guest")
+
+        if dominfo._stateGet() != DOM_STATE_HALTED:
+            dominfo.image.signalDeviceModel("usb-add",
+                "usb-added", dev_id)
+        else:
+            log.debug("error: Domain is not running!")
+
+
+    def domain_usb_del(self, domid, dev_id):
+        dominfo = self.domain_lookup_nr(domid)
+        if not dominfo:
+            raise XendInvalidDomain(str(domid))
+
+        usb = dominfo.info['platform'].get('usb')
+        if not usb:
+            raise XendError("Can't add usb device to a guest with usb disabled in configure file")
+
+        hvm = dominfo.info.is_hvm()
+        if not hvm:
+            raise XendError("Can't del usb to a non-hvm guest")
+
+        if dominfo._stateGet() != DOM_STATE_HALTED:
+            dominfo.image.signalDeviceModel("usb-del",
+                "usb-deleted", dev_id)
+        else:
+            log.debug("error: Domain is not running!")
+
     def domain_pincpu(self, domid, vcpu, cpumap):
         """Set which cpus vcpu can use
 
index 97887af61a25693f3e0e6a8a493db03d6b0785a3..3d9868f984a617ad5cc5ed806d38fbc769e979ac 100644 (file)
@@ -225,6 +225,19 @@ class SrvDomain(SrvDir):
         self.acceptCommand(req)
         return self.xd.domain_reset(self.dom.getName())
 
+    def op_usb_add(self, op, req):
+        self.acceptCommand(req)
+        return req.threadRequest(self.do_usb_add, op, req)
+
+    def do_usb_add(self, _, req):
+        return self.xd.domain_usb_add(self.dom.getName(), req)
+    def op_usb_del(self, op, req):
+        self.acceptCommand(req)
+        return req.threadRequest(self.do_usb_add, op, req)
+
+    def do_usb_del(self, _, req):
+        return self.xd.domain_usb_add(self.dom.getName(), req)
 
     def render_POST(self, req):
         return self.perform(req)
index 8372b08f58fd80e7aad39f9c88f70ecb984503de..94236a6ab7cc1d9ce00a93133e2eb910f5dae2b7 100644 (file)
@@ -161,6 +161,9 @@ SUBCOMMAND_HELP = {
     'vcpu-set'    : ('<Domain> <vCPUs>',
                      'Set the number of active VCPUs for allowed for the'
                      ' domain.'),
+    #usb
+    'usb-add'     : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Add the usb device to FV VM.'),
+    'usb-del'     : ('<domain> <[host:bus.addr] [host:vendor_id:product_id]>','Delete the usb device to FV VM.'),
 
     # device commands
 
@@ -351,6 +354,8 @@ common_commands = [
     "top",
     "unpause",
     "uptime",
+    "usb-add",
+    "usb-del",
     "vcpu-set",
     ]
 
@@ -383,6 +388,8 @@ domain_commands = [
     "top",
     "unpause",
     "uptime",
+    "usb-add",
+    "usb-del",
     "vcpu-list",
     "vcpu-pin",
     "vcpu-set",
@@ -1474,6 +1481,14 @@ def xm_mem_set(args):
     else:
         mem_target = int_unit(args[1], 'm')
         server.xend.domain.setMemoryTarget(dom, mem_target)
+
+def xm_usb_add(args):
+    arg_check(args, "usb-add", 2)
+    server.xend.domain.usb_add(args[0],args[1])
+
+def xm_usb_del(args):
+    arg_check(args, "usb-del", 2)
+    server.xend.domain.usb_del(args[0],args[1])
     
 def xm_vcpu_set(args):
     arg_check(args, "vcpu-set", 2)
@@ -3312,6 +3327,9 @@ commands = {
     "tmem-set": xm_tmem_set,
     "tmem-freeable": xm_tmem_freeable_mb,
     "tmem-shared-auth": xm_tmem_shared_auth,
+    #usb
+    "usb-add": xm_usb_add,
+    "usb-del": xm_usb_del,
     }
 
 ## The commands supported by a separate argument parser in xend.xm.